﻿#include "DAAppDataManager.h"
#include <QList>
// DADataManager cpp -- copy to cpp

namespace DA
{
class DAAppDataManagerPrivate
{
    DA_IMPL_PUBLIC(DAAppDataManager)
public:
    DAAppDataManagerPrivate(DAAppDataManager* p);
    QList< DAData > _dataList;
};
}  // namespace DA

//===================================================
// using DA namespace -- 禁止在头文件using！！
//===================================================

using namespace DA;

//===================================================
// DAAppDataManagerPrivate
//===================================================

DAAppDataManagerPrivate::DAAppDataManagerPrivate(DAAppDataManager* p) : q_ptr(p)
{
}

//===================================================
// DAAppDataManager
//===================================================

DAAppDataManager::DAAppDataManager(DACoreInterface* c, QObject* p)
    : DADataManagerInterface(c, p), d_ptr(new DAAppDataManagerPrivate(this))
{
    qRegisterMetaType< DAData >("DAData");
}

DAAppDataManager::~DAAppDataManager()
{
}

void DAAppDataManager::addData(const DAData& d)
{
    int index  = d_ptr->_dataList.size();
    DAData tmp = d;
    emit dataBeginAdd(tmp, index);
    setUniqueDataName(tmp);
    d_ptr->_dataList.push_back(tmp);
    emit dataEndAdded(tmp, index);
}

void DAAppDataManager::removeData(const DAData& d)
{
    int index = d_ptr->_dataList.indexOf(d);
    emit dataBeginRemove(d, index);
    d_ptr->_dataList.removeAt(index);
    emit dataEndRemoved(d, index);
}

int DAAppDataManager::getDataCount() const
{
    return d_ptr->_dataList.size();
}

int DAAppDataManager::dataIndex(const DAData& d) const
{
    return d_ptr->_dataList.indexOf(d);
}

DAData DAAppDataManager::getData(int index) const
{
    return d_ptr->_dataList.at(index);
}

void DAAppDataManager::callDataInfomationChanged(const DAData& d, DAAppDataManager::ChangeType t)
{
    emit dataInfomationChanged(d, t);
}

/**
 * @brief 设置一个全局唯一的名字
 * @param d
 */
void DAAppDataManager::setUniqueDataName(DAData& d) const
{
    QString n = d.getName();
    if (n.isEmpty()) {
        n = d.typeToString();
        d.setName(n);
    }
    QSet< QString > names = getDatasNameSet();
    if (!names.contains(n)) {
        return;
    }
    int index = -1;
    do {
        index = n.lastIndexOf("_");
        if (index <= 0) {  //等于0也要包含
            n = n + QString("_1");
        } else if (index != 0) {
            if (index == n.size() - 1) {
                //以_结尾
                n = n + QString("1");
            } else {
                //说明有_xx,但要确认这个xx是数字
                QString suf = n.mid(index + 1);
                bool isnum  = false;
                int num     = suf.toInt(&isnum);
                if (isnum) {
                    //说明是_num结尾
                    n = n.mid(0, index) + QString("_%1").arg(++num);
                } else {
                    n = n + QString("_1");
                }
            }
        }
    } while (names.contains(n));
    d.setName(n);
}

/**
 * @brief 把所有管理的变量的名字按照set返回
 * @return
 */
QSet< QString > DAAppDataManager::getDatasNameSet() const
{
    QSet< QString > names;
    for (const DAData& d : d_ptr->_dataList) {
        names.insert(d.getName());
    }
    return names;
}
